package com.wn.date20190731;

import java.awt.FontFormatException;
import java.util.Scanner;

public class Calendar
{

	/**
	 * 
		5，已知周一是1900年1月1号，请从键盘输入年份和月份，输出其月历
		  如：2019  7  输出
		  日  一  二  三  四  五  六
		        1   2    3   4   5   6
		  7    8   9   10  11 12 13
		  14 15 16  17  18 19 20
		  21 22  23  24  25 26 27
		  28 29  30  31
	 * @param args
	 */
	public static void main(String[] args)
	{
		// TODO Auto-generated method stub
		Scanner scanner=new Scanner(System.in);
		/*
		 * 接收输入
		 */
		System.out.println("请输入年份");
		int year=scanner.nextInt();
		
		System.out.println("请输入月份");
		int month=scanner.nextInt();
		
//		int year=2019;
//		int month=8;
		System.out.println("日\t一\t二\t三\t四\t五\t六\t");
		
		int week=getWeek(year, month);//周日 0 \t，周几就空几个
		int days=getDays(year, month);//当月天数
		//
		int dateOne=1;
		while(dateOne<=days) 
		{
			for(int j=0;j<7;)
			{
				//输出第一排空格
				if(dateOne==1) 
				{
					for(int k=0;k<week;k++)
					{
						System.out.print("\t");
						j++;
					}
				}
				
				//输出日期
				System.out.print(dateOne+"\t");
				dateOne++;
				j++;
				//天数过完后跳出
				if(dateOne>days)
					break;
				
			}
			//七天换行
			System.out.println();
		}						
	}
	
	//是否闰年
	public static boolean isLeap(int y)
	{
		if((y%4==0&&y%100!=0)||y%400==0)
		{
			return true;
		}
		return false;
	}
	//获取距1900年年份
	public static int getIntervalYear(int y)
	{
		
		return (y-1900);
	}
	//计算月份天数
	public static int  getDays(int y,int m)
	{
		int days=0;
		switch (m)
		{
		case 4:
		case 6:
		case 9:
		case 11:
			days=30;
			break;

		case 2:
			if(isLeap(y)) {
				days=29;
				break;
			}else {
				days=28;
				break;
			}
		default:
			days=31;
			break;
		}
		return days;
	}
	
	
	//计算距1990.1.1的天数
	public static int getIntervalDays(int y, int m)
	{
		int day=0;
		//循环年份		
		for(int i=0;i<getIntervalYear(y);i++)
		{
			if(isLeap(1900+i))
			{
				day+=366;
			}
			else {
				day+=365;
			}
		}

		//当年年内天数 1992.3, 1992内一月和二月天数
		for(int i=1;i<m;i++)
		{
			day+=getDays(y, i);
		}
		
		return day;
	}
	
	
	//获取周数
	public  static int getWeek(int y,int m)
	{
		int day=getIntervalDays(y, m);
		//day%7的结果为0则是周一，1为周二，2周三，周四，周五，5周六，6周日
		return day%7+1;
			
	}

}
